<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>01.let和const</title>
</head>
<body>
    <script>
        // 1.ES6 新增了let命令，用来声明变量。它的用法类似于var，但是所声明的变量，只在let命令所在的代码块内有效。
        /*
        {
            let a = 10;
            var b = 1;
        }
        console.log(a); // a is not defined.
        console.log(b); // 1
        */

        /* //变量i是var命令声明的，在全局范围内都有效，所以全局只有一个变量i。
        var a = [];
        for (var i = 0; i < 10; i++) {
        a[i] = function () {
            console.log(i);
        };
        }
        a[6](); // 10
        */
        
        /* //变量i是let声明的，当前的i只在本轮循环有效，所以每一次循环的i其实都是一个新的变量，所以最后输出的是6。
        var a = [];
        for (let i = 0; i < 10; i++) {
        a[i] = function () {
            console.log(i);
        };
        }
        a[6](); // 6
        */

        for (let i = 0; i < 3; i++) {
            let i = 'abc';
            console.log(i);
        } // 输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域，有各自单独的作用域。

        // 2.不存在变量提升
        // var 的情况
        console.log(foo); // 输出undefined
        var foo = 2;

        // let 的情况
        console.log(bar); // 报错ReferenceError: bar is not defined
        let bar = 2;

        // 2.const
        // const声明一个只读的常量。一旦声明，常量的值就不能改变。
        // const的作用域与let命令相同：只在声明所在的块级作用域内有效。
        const PI = 3.1415;
        PI // 3.1415

        PI = 3;
        // TypeError: Assignment to constant variable.
        // const声明的变量不得改变值，这意味着，const一旦声明变量，就必须立即初始化，不能留到以后赋值。

    </script>
</body>
</html>